package logic

import (
	"bluebell/dao/mysql"
	"bluebell/dao/redis"
	"bluebell/models"
	"bluebell/pkg/snowflake"
	"fmt"
	"go.uber.org/zap"
)

// 涉及到数据的改动在这一层操作

func CreatePost(p *models.Post) (err error) {
	// 生成 post ID
	pid, _ := snowflake.GetID()
	p.ID = int64(pid)
	// redis 记录
	// 存储到数据库
	err = mysql.CreatePost(p)

	if err != nil {
		return
	}

	err = redis.CreatePost(p.ID, p.CommunityID)

	return
}

func GetPostDetail(id int64) (data *models.ApiPostDetail, err error) {
	// 从数据库拿取帖子详情
	data = new(models.ApiPostDetail)

	postData, err := mysql.GetPostDetailWithDB(id)
	if err != nil {

		return
	}
	// 根据用户ID，查询其名称
	user, err := mysql.GetUserByID(postData.AuthorID)
	// 查询社区详细信息
	if err != nil {

		return
	}
	community, err := mysql.GetCommunityDetail(postData.CommunityID)
	if err != nil {

		return
	}
	// 组装数据

	data.AuthorName = user.Username
	data.Post = postData
	data.CommunityDetail = community

	return

}

func GetPostList(offset int64) ([]*models.ApiPostDetail, error) {
	// 从数据库查询

	postList, err := mysql.GetPostList(offset)
	for _, v := range postList {
		fmt.Println(*v)
	}
	// 组装数据 如果是指针，使用 new()
	data := make([]*models.ApiPostDetail, 0, len(postList))
	for _, postData := range postList {
		// 根据用户ID，查询其名称
		user, err2 := mysql.GetUserByID(postData.AuthorID)
		// 查询社区详细信息
		if err2 != nil {

			return nil, err2
		}
		community, err2 := mysql.GetCommunityDetail(postData.CommunityID)
		if err2 != nil {

			return nil, err2

		}
		postDetail := &models.ApiPostDetail{user.Username, postData, community, 0}
		data = append(data, postDetail)

	}
	return data, err
}

func GetPostListV2(offset int64, p *models.ParamPostList) ([]*models.ApiPostDetail, error) {
	// 从数据库查询

	// 根据 p 中的 order_key 从redis中获取 post_id
	ids, err := redis.GetPostIDWithOrderKey(p, offset)
	if err != nil {
		zap.L().Error("根据 order_key 从 redis获取 postid列表失败", zap.Error(err))
		return nil, err
	}
	// 根据 post_id 列表从 mysql拿数据
	postList, err := mysql.GetPostListWithIDS(ids)
	// 组装数据 如果是指针，使用 new()
	// 增加当前帖子的分数, 根据ids中的 post_id从redis中去查询
	countList, err := redis.GetPostVotedData(ids)
	if err != nil {
		return nil, err
	}

	data := make([]*models.ApiPostDetail, 0, len(postList))
	for index, postData := range postList {
		// 根据用户ID，查询其名称
		user, err2 := mysql.GetUserByID(postData.AuthorID)
		// 查询社区详细信息
		if err2 != nil {

			return nil, err2
		}
		community, err2 := mysql.GetCommunityDetail(postData.CommunityID)
		if err2 != nil {

			return nil, err2

		}
		postDetail := &models.ApiPostDetail{user.Username, postData, community, countList[index]}
		data = append(data, postDetail)

	}
	return data, err
}
func GetPostListWithCommunity(offset int64, p *models.ParamPostListWithCommunity) ([]*models.ApiPostDetail, error) {
	// 从数据库查询

	// 根据 p 中的 order_key 从redis中获取 post_id
	// 使用zinterstore, 把社区的帖子set 和贴子分数的 zset 生成一个新的 zset

	// 利用缓存 key 减少 zinterstore 执行的次数

	ids, err := redis.GetCommunityIDWithOrderkey(p, offset)
	if err != nil {
		zap.L().Error("根据 order_key 从 redis 获取 postid 列表失败", zap.Error(err))
		return nil, err
	}
	// 根据 post_id 列表从 mysql拿数据
	postList, err := mysql.GetPostListWithIDS(ids)
	// 组装数据 如果是指针，使用 new()
	// 增加当前帖子的分数, 根据ids中的 post_id从redis中去查询
	countList, err := redis.GetPostVotedData(ids)
	if err != nil {
		return nil, err
	}

	data := make([]*models.ApiPostDetail, 0, len(postList))
	for index, postData := range postList {
		// 根据用户ID，查询其名称
		user, err2 := mysql.GetUserByID(postData.AuthorID)
		// 查询社区详细信息
		if err2 != nil {

			return nil, err2
		}
		community, err2 := mysql.GetCommunityDetail(postData.CommunityID)
		if err2 != nil {

			return nil, err2

		}
		postDetail := &models.ApiPostDetail{user.Username, postData, community, countList[index]}
		data = append(data, postDetail)

	}
	return data, err
}
